home *** CD-ROM | disk | FTP | other *** search
- WINDOW OFF
- WINDOW 1,"",(0,0)-(0,0),1
- WINDOW CLOSE 1
-
- ' -----------------------------------------------------------------------------------------------
-
- DIM itype%(64),ihndl&(64),4 irect$(64)
-
- DIM 6 Op$(30)
- DIM T$(10,10)
- DIM 20 Z$(10,10,20)
- DIM 2 O$(10,10,20)
- DIM 2 P$(10,10,20)
- DIM N!(10,10,20)
- DIM M!(10,10,20)
- DIM Num(10,10)
- DIM Error$(15)
- DIM K(10)
- DIM F&(48)
- DIM N(4)
- DIM N$(2)
-
- ' -----------------------------------------------------------------------------------------------
-
- Res%=FN OPENRESFILE("Terme.Res")
- Dloghndl&=FN GETNEWDIALOG(144,0,-1)
- Wptr&=FN FRONTWINDOW
- CALL SETPORT(Wptr&)
- COORDINATE WINDOW
- PEN 2,2,1,8,0
- BOX 1,-1 TO 441,213
-
- ' -----------------------------------------------------------------------------------------------
-
- Hndl&=FN GETRESOURCE(CVI("STR#"),128)
- Adr&=PEEK LONG(Hndl&)+2
- Num=PEEK(Adr&-1)
- FOR N=1 TO Num
- Length=PEEK(Adr&)
- A$=""
- FOR I=1 TO Length
- A$=A$+CHR$(PEEK(Adr&+I))
- NEXT I
- Adr&=Adr&+Length+1
- Error$(N)=A$
- NEXT N
-
- ' -----------------------------------------------------------------------------------------------
-
- item=0
- DO
- item=item+1
- CALL GETDITEM(Dloghndl&,item,itype%(item),ihndl&(item),irect$(item))
- UNTIL ihndl&(item)=0 OR item=64
-
- DATA SIN, COS, TAN, COT, SINH, COSH, TANH, COTH, ASIN, ACOS, ATAN, ACOT
- DATA ASINH, ACOSH, ATANH, ACOTH, LN, LOG, EXP, FAK, INT, FRAC, ABS, SQR
- DATA A, B, C, D, F, G, H, I, J, K, L, M
- DATA N, O, P, Q, R, S, T, U, V, W, Y, Z
-
- FOR I=1 TO 48
- READ PSTR$(F&(I))
- NEXT I
-
- FOR I=25 TO 48
- Op$(I-24)=PSTR$(F&(I))
- NEXT I
-
- Op$(25)="^":Op$(26)="^":Op$(27)="*":Op$(28)="/":Op$(29)="+":Op$(30)="-"
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Fehler
-
- TEXT 3,9,0,0
- CALL SETITEXT(ihndl&(6),Err$)
- BEEP
- Txt$=""
- CALL SELITEXT(Dloghndl&,3,0,255)
- GOTO "TERMLOOP"
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Neu
-
- FOR S=1 TO 10
- FOR N=1 TO 10
- FOR J=1 TO 20
- N!(S,N,J)=0
- M!(S,N,J)=0
- O$(S,N,J)=""
- P$(S,N,J)=""
- Z$(S,N,J)=""
- NEXT J
- Num(S,N)=0
- T$(S,N)=""
- NEXT N
- K(S)=0
- NEXT S
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Term
- Term$=UCASE$(Term$)
-
- LONG IF LEN(Term$)>1
- DO
- Len=LEN(Term$)
- N=INSTR(1,Term$," ")
- LONG IF N
- Term$=LEFT$(Term$,N-1)+RIGHT$(Term$,Len-N)
- END IF
- UNTIL N=0
-
- Len=LEN(Term$)
-
- FOR I=1 TO 4
-
- DO
- N(1)=INSTR(1,Term$,"[")
- N(2)=INSTR(1,Term$,"{")
- N(3)=INSTR(1,Term$,"]")
- N(4)=INSTR(1,Term$,"}")
- LONG IF N(I)
- IF I<3 THEN MID$(Term$,N(I),1)="(" ELSE MID$(Term$,N(I),1)=")"
- END IF
- UNTIL N(I)=0
-
- NEXT I
-
- FOR I=1 TO 2
-
- DO
- FOR J=1 TO Len
- Len=LEN(Term$)
- N(1)=INSTR(J,Term$,"X")
- N(2)=INSTR(J,Term$,"(")
- N$=MID$(Term$,N(I)-1,1)
- LONG IF (N$>="0" AND N$<="9") OR N$="X" OR N$=")"
- IF N(I)>1 THEN Term$=LEFT$(Term$,N(I)-1)+"*"+RIGHT$(Term$,Len-(N(I)-1))
- END IF
- NEXT J
- UNTIL (N$<"0" OR N$>"9") AND N$<>"X" AND N$<>")"
-
- NEXT I
- END IF
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Ersetzen
-
- LONG IF LEN(Term$)>2
- FOR I=24 TO 1 STEP -1
- S$=PSTR$(F&(I))
- LenS=LEN(S$)
-
- DO
- Len=LEN(Term$)
- N=INSTR(1,Term$,S$)
- LONG IF N
- S2$=MID$(Term$,N+LenS,1)
- LONG IF S2$<>"("
- Err$=Error$(1)
- FN Fehler
- CALL SELITEXT(Dloghndl&,3,0,255)
- END IF
- Term$=LEFT$(Term$,N-1)+"1"+PSTR$(F&(I+24))+RIGHT$(Term$,Len-LenS-(N-1))
- END IF
- UNTIL N=0
-
- NEXT I
-
- FOR I=1 TO 26
- LONG IF CHR$(64+I)<>"X" AND CHR$(64+I)<>"E"
-
- DO
- FOR J=1 TO Len
- Len=LEN(Term$)
- N=INSTR(J,Term$,CHR$(64+I))
- N$=MID$(Term$,N-2,1)
- LONG IF (N$>="0" AND N$<="9") OR N$="X" OR N$=")"
- IF N>2 THEN Term$=LEFT$(Term$,N-2)+"*"+RIGHT$(Term$,Len-(N-2))
- END IF
- NEXT J
- UNTIL (N$<"0" OR N$>"9") AND N$<>"X" AND N$<>")"
-
- END IF
- NEXT I
- END IF
-
- FOR I=1 TO LEN(Term$)
- S$=MID$(Term$,I,1)
- LONG IF (S$>="A" AND S$<="Z") AND S$<>"X" AND S$<>"E"
- N$=MID$(Term$,I+1,1)
- LONG IF N$<>"("
- Err$=Error$(2)
- FN Fehler
- CALL SELITEXT(Dloghndl&,3,0,255)
- END IF
- END IF
- NEXT I
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Klammer
-
- Max=1
- Auf=0
- Zu=0
- S=1
- K(1)=1
- Length=LEN(Term$)
-
- FOR I=1 TO Length
- S$=MID$(Term$,I,1)
-
- SELECT S$
- CASE "("
- T$(S,K(S))=T$(S,K(S))+"•"
- Auf=Auf+1
- S=S+1
- LONG IF Auf>10
- Err$=Error$(3)
- FN Fehler
- XELSE
- Err$=""
- END IF
- K(S)=K(S)+1
- LONG IF K(S)>10
- Err$=Error$(4)
- FN Fehler
- XELSE
- Err$=""
- END IF
- IF S>Max THEN Max=S
- CASE ")"
- Zu=Zu+1
- S=S-1
- CASE ELSE
- T$(S,K(S))=T$(S,K(S))+S$
- END SELECT
-
- NEXT I
-
- LONG IF Auf<>Zu
- Diff=Auf-Zu
- IF Auf-Zu=1 THEN Err$=STR$(Diff)+Error$(5)
- IF Auf-Zu>1 THEN Err$=STR$(Diff)+Error$(6)
- IF Zu-Auf=1 THEN Err$=STR$(-Diff)+Error$(7)
- IF Zu-Auf>1 THEN Err$=STR$(-Diff)+Error$(8)
- FN Fehler
- END IF
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Scanner
-
- FOR S=1 TO Max
- FOR N=1 TO K(S)
-
- J=1:K=1
- Length=LEN(T$(S,N))
- Z$(N,S,J)=""
-
- FOR I=1 TO Length
- S$=MID$(T$(S,N),I,1)
-
- LONG IF VAL(S$) OR S$="0" OR S$="." OR S$="X" OR S$="π" OR S$="E" OR S$="•"
-
- IF I=2 AND MID$(T$(S,N),1,1)="-" THEN Z$(S,N,J)="-"+Z$(S,N,J)
- IF MID$(T$(S,N),I-2,2)="^-" THEN Z$(S,N,J)="-"+Z$(S,N,J)
- Z$(S,N,J)=Z$(S,N,J)+S$
-
- LONG IF Z$(S,N,J)="E" OR Z$(S,N,J)="-E" OR Z$(S,N,J)="π" OR Z$(S,N,J)="-π"
- IF Z$(S,N,J)= "E" THEN N!(S,N,J)= 2.718281828
- IF Z$(S,N,J)="-E" THEN N!(S,N,J)=-2.718281828
- IF Z$(S,N,J)= "π" THEN N!(S,N,J)= 3.141592654
- IF Z$(S,N,J)="-π" THEN N!(S,N,J)=-3.141592654
- XELSE
- N!(S,N,J)=VAL(Z$(S,N,J))
- END IF
-
- XELSE
-
- LONG IF S$="+" OR S$="-" OR S$="*" OR S$="/" OR S$="^"
- LONG IF MID$(T$(S,N),I-1,1)<>"^" AND I<>1
- O$(S,N,K)=S$
- K=K+1
- END IF
- XELSE
- LONG IF S$>="A" AND S$<="Z"
- O$(S,N,K)=S$
- K=K+1
- END IF
- END IF
-
- LONG IF Z$(S,N,J)<>""
- J=J+1
- LONG IF J>20
- Err$=Error$(9)
- FN Fehler
- END IF
- END IF
-
- END IF
-
- NEXT I
- Num(S,N)=J
-
- NEXT N
- NEXT S
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Fak!(n!)
-
- LONG IF n!=0
- Fak!=1
- XELSE
- Fak!=n!*FN Fak!(n!-1)
- END IF
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Funktion
-
- FOR L=1 TO 29 STEP 2
- I=0
-
- DO
- I=I+1
-
- LONG IF P$(S,N,I)=Op$(L) OR P$(S,N,I)=Op$(L+1)
- X1!=M!(S,N,I):X2!=M!(S,N,I+1)
-
- SELECT P$(S,N,I)
- ' ------------------------- Operatoren ------------
- CASE "+"
- X#=X1!+X2!
- CASE "-"
- X#=X1!-X2!
- CASE "*"
- X#=X1!*X2!
- CASE "/"
- X#=X1!/X2!
- CASE "^"
- X#=X1!^X2!
- ' ------------------------- Funktionen ------------
- CASE "A"
- X#=SIN(X2!) 'sin
- CASE "B"
- X#=COS(X2!) 'cos
- CASE "C"
- X#=TAN(X2!) 'tan
- CASE "D"
- X#=1/TAN(X2!) 'cot
- CASE "F"
- X#=(EXP(X2!)-EXP(-X2!))/2 'sinh
- CASE "G"
- X#=(EXP(X2!)+EXP(-X2!))/2 'cosh
- CASE "H"
- X#=(EXP(X2!)-1)/(EXP(X2!)+1) 'tanh
- CASE "I"
- X#=(EXP(X2!)+1)/(EXP(X2!)-1) 'coth
- CASE "J"
- X#=ATN(X2!/SQR(1-X2!*X2!)) 'arcsin
- CASE "K"
- X#=ATN(1)*2-ATN(X2!/SQR(1-X2!*X2!)) 'arccos
- CASE "L"
- X#=ATN(X2!) 'arctan
- CASE "M"
- X#=ATN(1)*2-ATN(X2!) 'arccot
- CASE "N"
- X#=LOG(X2!+SQR(X2!*X2!+1)) 'arcsinh
- CASE "O"
- X#=LOG(X2!+SQR(X2!*X2!-1)) 'arccosh
- CASE "P"
- X#=LOG((1+X2!)/(1-X2!))/2 'arctanh
- CASE "Q"
- X#=LOG((X2!+1)/(X2!-1))/2 'arccoth
- CASE "R"
- X=LOG(X2!) 'ln x
- CASE "S"
- X#=LOG(X2!)/LOG(10) 'lg x
- CASE "T"
- X#=EXP(X2!) 'e^x
- CASE "U"
- X#=FN Fak!(X2!) 'fakultät
- CASE "V"
- X#=INT(X2!) 'integer
- CASE "W"
- X#=FRAC(X2!) 'fraction
- CASE "Y"
- X#=ABS(X2!) 'absolut
- CASE "Z"
- X#=SQR(X2!) 'wurzel
- END SELECT
-
- M!(S,N,I)=X#
-
- old&=VARPTR(M!(S,N,I+2))
- max&=VARPTR(M!(S,N,Nmax))
- new&=VARPTR(M!(S,N,I+1))
- Length=max&-old&+4
- BLOCKMOVE old&,new&,Length
-
- old&=VARPTR(P$(S,N,I+1))
- max&=VARPTR(P$(S,N,Nmax))
- new&=VARPTR(P$(S,N,I))
- Length=max&-old&+3
- BLOCKMOVE old&,new&,Length
-
- Nmax=Nmax-1
- I=0
-
- END IF
-
- UNTIL I>=Nmax-1
-
- NEXT L
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Parser
-
- FOR S=Max TO 1 STEP -1
- W=0
- FOR N=1 TO K(S)
-
- FOR J=1 TO Num(S,N)
-
- SELECT Z$(S,N,J)
- CASE "X"
- N!(S,N,J)=x!
- CASE "-X"
- N!(S,N,J)=-x!
- CASE "•"
- W=W+1
- N!(S,N,J)=M!(S+1,W,1)
- CASE "-•"
- W=W+1
- N!(S,N,J)=-M!(S+1,W,1)
- END SELECT
-
- Nmax=Num(S,N)
- old&=VARPTR(N!(S,N,1))
- max&=VARPTR(N!(S,N,Nmax))
- new&=VARPTR(M!(S,N,1))
- Length=max&-old&+4
- BLOCKMOVE old&,new&,Length
-
- old&=VARPTR(O$(S,N,1))
- max&=VARPTR(O$(S,N,Nmax-1))
- new&=VARPTR(P$(S,N,1))
- Length=max&-old&+3
- BLOCKMOVE old&,new&,Length
-
- FN Funktion
-
- NEXT J
-
- NEXT N
- NEXT S
-
- END FN
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Rechnen
-
- CALL GETITEXT(ihndl&(4),X$)
-
- x!=VAL(X$)
-
- FN Parser
-
- W$=STR$(M!(1,1,1))+" "
- TEXT 3,9,0,0
- CALL SETITEXT(ihndl&(5),W$)
-
- END FN
-
-
- ' -----------------------------------------------------------------------------------------------
-
- LONG FN Test
-
- test=0
- IF S$>="0" AND S$<="9" THEN test=1
- IF S$>="a" AND S$<="z" THEN test=1
- IF S$>="A" AND S$<="Z" THEN test=1
- IF S$="π" OR S$="∏" THEN test=1
- IF S$=" " OR S$="." OR S$="," THEN test=1
- IF S$="(" OR S$="[" OR S$="{" THEN test=1
- IF S$=")" OR S$="]" OR S$="}" THEN test=1
- IF S$="+" OR S$="-" OR S$="*" OR S$="/" OR S$="^" THEN test=1
-
- END FN
-
- ' ===============================================================================================
-
- "TERMLOOP"
-
- CALL GETITEXT(ihndl&(3),T$)
- CALL GETITEXT(ihndl&(4),X$)
-
- CALL MODALDIALOG(0,REF)
-
- LONG IF REF=1
- LONG IF T$<>""
- IF X$="" THEN X$="0"
- CALL SETITEXT(ihndl&(4),X$)
- CALL SELITEXT(Dloghndl&,4,0,255)
- GOTO "TERMEVAL"
- XELSE
- Err$=Error$(11)
- CALL SELITEXT(Dloghndl&,3,0,255)
- FN Fehler
- END IF
- END IF
-
- IF REF=3 THEN GOTO "TERMEDIT"
- IF REF=4 THEN GOTO "XEDIT"
- IF REF=12 THEN "TERMEND"
-
- GOTO "TERMLOOP"
-
- ' -----------------------------------------------------------------------------------------------
-
- "TERMEDIT"
-
- CALL SETITEXT(ihndl&(6),Txt$)
- CALL GETITEXT(ihndl&(3),T$)
-
- S$=RIGHT$(T$,1)
- LONG IF S$=")" AND INSTR(1,T$,"(")=0
- T$=LEFT$(T$,LEN(T$)-1)
- CALL SETITEXT(ihndl&(3),T$)
- Err$=Error$(12)
- CALL SELITEXT(Dloghndl&,3,0,255)
- FN Fehler
- END IF
-
- FN Test
-
- LONG IF test=0
- T$=LEFT$(T$,LEN(T$)-1)
- CALL SETITEXT(ihndl&(3),T$)
- Err$=Error$(13)
- FN Fehler
- CALL SELITEXT(Dloghndl&,3,255,255)
- END IF
-
- SELECT
- CASE S$=","
- T$=LEFT$(T$,LEN(T$)-1)+"."
- CALL SETITEXT(ihndl&(3),T$)
- CASE S$>="0" AND S$<="9"
- S$=MID$(T$,LEN(T$)-1,1)
- LONG IF S$="x" OR S$="X" OR S$=")"
- T$=LEFT$(T$,LEN(T$)-1)
- CALL SETITEXT(ihndl&(3),T$)
- Err$=Error$(14)
- FN Fehler
- END IF
- END SELECT
-
- GOTO "TERMLOOP"
-
- ' -----------------------------------------------------------------------------------------------
-
- "XEDIT"
-
- CALL SETITEXT(ihndl&(6),Txt$)
- CALL GETITEXT(ihndl&(4),X$)
-
- LONG IF RIGHT$(X$,1)=","
- X$=LEFT$(X$,LEN(X$)-1)+"."
- CALL SETITEXT(ihndl&(4),X$)
- END IF
-
- LONG IF X$="π" OR X$="-π" OR X$="e" OR X$="-e"
- IF X$="π" THEN X$="3.14159265358979324"
- IF X$="e" THEN X$="2.71828182845904524"
- IF X$="-π" THEN X$="-3.14159265358979324"
- IF X$="-e" THEN X$="-2.71828182845904524"
- TEXT 3,9,0,0
- CALL SETITEXT(ihndl&(4),X$)
- END IF
-
- M$=RIGHT$(X$,1)
- LONG IF M$<>"" AND M$<>"." AND M$<>"-" AND (M$<"0" OR M$>"9")
- M$=LEFT$(X$,LEN(X$)-1)
- TEXT 3,9,0,0
- CALL SETITEXT(ihndl&(4),M$)
- Err$=Error$(15)
- FN Fehler
- END IF
-
- GOTO "TERMLOOP"
-
- ' -----------------------------------------------------------------------------------------------
-
- "TERMEVAL"
-
- CALL GETITEXT(ihndl&(3),Neu$)
-
- LONG IF Neu$<>Alt$
- FN Neu
- Term$=Neu$
- Alt$=Neu$
- Neu$=""
- FN Term
- FN Ersetzen
- FN Klammer
- FN Scanner
- END IF
-
- FN Rechnen
-
- GOTO "TERMLOOP"
-
- ' -----------------------------------------------------------------------------------------------
-
- "TERMEND"
-
- CALL DISPOSDIALOG(Dloghndl&)
- END
-
- ' -----------------------------------------------------------------------------------------------
-